package com.estagio.bean;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import org.primefaces.context.RequestContext;

import com.estagio.entity.Aluno;
import com.estagio.entity.CondicaoPagamento;
import com.estagio.entity.ContaReceber;
import com.estagio.entity.Matricula;
import com.estagio.entity.Periodo;
import com.estagio.entity.Plano;
import com.estagio.entity.PlanoModalidade;
import com.estagio.session.AlunoSession;
import com.estagio.session.ContaReceberSession;
import com.estagio.session.MatriculaSession;
import com.estagio.session.PlanoModalidadeSession;
import com.estagio.session.PlanoSession;

@ManagedBean(name="matriculaBean")
@SessionScoped
public class MatriculaBean {
	
	//MATRICULA
	private Matricula matricula = new Matricula();
	private DataModel dmMatricula;
	
	//ALUNO
	private Aluno aluno = new Aluno();
	private DataModel dmAluno;
	
	//PLANO/MODALIDADE
	private List<PlanoModalidade> listPlanoModalidade;	

	//PLANO
	private Plano plano = new Plano();
	private Plano planoSelecionado;
	private DataModel dmPlano;
	
	//CONTAS A RECEBER
	private List<ContaReceber> listContaReceber;

	public List<PlanoModalidade> getListPlanoModalidade() {
		return listPlanoModalidade;
	}

	public void setListPlanoModalidade(List<PlanoModalidade> listPlanoModalidade) {
		this.listPlanoModalidade = listPlanoModalidade;
	}

	public Aluno getAluno() {
		return aluno;
	}

	public void setAluno(Aluno aluno) {
		this.aluno = aluno;
	}

	public DataModel getDmAluno() {
		return dmAluno;
	}

	public void setDmAluno(DataModel dmAluno) {
		this.dmAluno = dmAluno;
	}




	//GETTERS AND SETTERS	
	
	
	
	public Matricula getMatricula() {
		return matricula;
	}

	public List<ContaReceber> getListContaReceber() {
		return listContaReceber;
	}

	public void setListContaReceber(List<ContaReceber> listContaReceber) {
		this.listContaReceber = listContaReceber;
	}

	public void setMatricula(Matricula matricula) {
		this.matricula = matricula;
	}

	public DataModel getDmMatricula() {
		return dmMatricula;
	}

	public void setDmMatricula(DataModel dmMatricula) {
		this.dmMatricula = dmMatricula;
	}

	public Plano getPlano() {
		return plano;
	}

	public void setPlano(Plano plano) {
		this.plano = plano;
	}

	public Plano getPlanoSelecionado() {
		return planoSelecionado;
	}

	public void setPlanoSelecionado(Plano planoSelecionado) {
		this.planoSelecionado = planoSelecionado;
	}

	public DataModel getDmPlano() {
		return dmPlano;
	}


	public void setDmPlano(DataModel dmPlano) {
		this.dmPlano = dmPlano;
	}
	
	//MATRICULA
	public void saveMatricula() {
		MatriculaSession session = new MatriculaSession();
		String mensagem = session.save(this.matricula);
		ContaReceberSession sessionCR = new ContaReceberSession();
		String mensagemCR = sessionCR.save(this.listContaReceber, this.matricula, null);
		
		if(!(mensagem.equals("Matricula salva com sucesso!"))) {
			FacesMessage faces = new FacesMessage(mensagem);
			FacesContext contexto = FacesContext.getCurrentInstance();
			contexto.addMessage(null, faces);
			RequestContext.getCurrentInstance().update("messages");
		} else {
			FacesMessage faces = new FacesMessage(mensagem);
			FacesContext contexto = FacesContext.getCurrentInstance();
			contexto.addMessage(null, faces);
			RequestContext.getCurrentInstance().update("messages");
		}
	}
	
	public DataModel findMatricula() {
		MatriculaSession session = new MatriculaSession();
		List<Matricula> lista = session.find(this.matricula);
		this.dmMatricula = new ListDataModel(lista);
		RequestContext.getCurrentInstance().update("formConsultarMatricula:dataTableMatricula");
		return this.dmMatricula;
	}
	
	//ALUNO
	public DataModel findAluno() {
		AlunoSession session = new AlunoSession();
		List<Aluno> lista = session.find(this.aluno);
		this.dmAluno = new ListDataModel(lista);
		return this.dmAluno;
	}
	
	public void selectAluno() {
		this.matricula.setAluno((Aluno) this.dmAluno.getRowData());
		RequestContext.getCurrentInstance().update("pgMatricula");
		RequestContext.getCurrentInstance().execute("dialogConsultarAluno.hide()");
	}

	//PLANO
	public DataModel findPlano() {
		PlanoSession planoSession = new PlanoSession();
		this.plano = new Plano();
		List<Plano> lista = planoSession.find(this.plano, null);
		this.dmPlano = new ListDataModel(lista);
		return this.dmPlano;
	}
	
	public void selectPlano() {
		this.matricula.setPlano((Plano) this.dmPlano.getRowData());
		ContaReceberSession session = new ContaReceberSession();
		ContaReceber cr = new ContaReceber();
		cr.setMatricula(this.matricula);
		this.listContaReceber = session.validaContaReceber(cr);
		
		PlanoModalidadeSession sessionPM = new PlanoModalidadeSession();
		PlanoModalidade pm = new PlanoModalidade();
		pm.setPlano(this.matricula.getPlano());
		this.listPlanoModalidade = sessionPM.find(pm);
		
		Calendar dtFinal = Calendar.getInstance();
		dtFinal.setTime(this.matricula.getDtMatricula());
		dtFinal.add(Calendar.MONTH, this.matricula.getPlano().getPeriodo().getMeses());
		
		this.matricula.setDtFinal(dtFinal.getTime());
		RequestContext.getCurrentInstance().update("pgData");
		RequestContext.getCurrentInstance().update("tableContasReceber");
		RequestContext.getCurrentInstance().update("pgPlano");
		RequestContext.getCurrentInstance().update("tablePlanoModalidade");
		RequestContext.getCurrentInstance().update("pgPeriodo");
		RequestContext.getCurrentInstance().update("messages");
	}
	
	public void clean() {
		this.plano = new Plano();
	}	

	
	//INVOCAR TELAS
	public String newMatricula() {
		this.matricula.setAluno(new Aluno());
		this.matricula.setPlano(new Plano());
		this.aluno = new Aluno();
		this.plano = new Plano();
		this.plano.setPeriodo(new Periodo());
		this.plano.setCondicaoPagamento(new CondicaoPagamento());
		this.matricula.setDtMatricula(new Date());
		return "manterMatricula";
	}

	public String consultarMatricula() {
		this.matricula = new Matricula();
		this.matricula.setAluno(new Aluno());
		return "consultarMatricula";
	}

	public String editarMatricula() {	
		this.matricula = (Matricula) this.dmMatricula.getRowData();
		PlanoModalidadeSession sessionPM = new PlanoModalidadeSession();
		PlanoModalidade planoModalidade = new PlanoModalidade();
		planoModalidade.setPlano(this.matricula.getPlano());
		this.listPlanoModalidade = sessionPM.find(planoModalidade);
		ContaReceber contaReceber = new ContaReceber();
		ContaReceberSession sessionCR = new ContaReceberSession();
		contaReceber.setMatricula(this.matricula);
		this.listContaReceber = sessionCR.findMatricula(contaReceber);
		
		return "editarMatricula";
	}
	
	public String excluirMatricula() {
		this.matricula = (Matricula) this.dmMatricula.getRowData();
		PlanoModalidadeSession sessionPM = new PlanoModalidadeSession();
		PlanoModalidade planoModalidade = new PlanoModalidade();
		planoModalidade.setPlano(this.matricula.getPlano());
		this.listPlanoModalidade = sessionPM.find(planoModalidade);
		ContaReceber contaReceber = new ContaReceber();
		ContaReceberSession sessionCR = new ContaReceberSession();
		contaReceber.setMatricula(this.matricula);
		this.listContaReceber = sessionCR.findMatricula(contaReceber);
		return "excluirMatricula";
	}
	
	//DIALOGS
	public void openDialogConsultarAluno() {
		this.aluno = new Aluno();
		RequestContext.getCurrentInstance().update("idDialogConsultarAluno");
		RequestContext.getCurrentInstance().execute("dialogConsultarAluno.show()");
	}
	
	public void openDialogConsultarPlano() {
		this.plano = new Plano();
		RequestContext.getCurrentInstance().update("idDialogConsultarPlano");
		RequestContext.getCurrentInstance().execute("dialogConsultarPlano.show()");
	}
	
	public void openDialogConsultarCondicaoPagamento() {
		RequestContext.getCurrentInstance().update("idDialogConsultarCondicaoPagamento");
		RequestContext.getCurrentInstance().execute("dialogConsultarCondicaoPagamento.show()");
	}
	
	public void openDialogManterPlano() {
		RequestContext.getCurrentInstance().update("idDialogManterPlano");
		RequestContext.getCurrentInstance().execute("dialogManterPlano.show()");
	}

	}
